Regular Expression

정규 표현식(Regular Expression)
Linux 유틸리티에서 텍스트 패턴 매칭을 위해 사용하는 정의 패턴 템플릿이다.
정규표현식은 크게 정규표현식 엔진을 사용하여 구현되며, 그 중 가장 인기 있는 엔진 2개는 아래와 같다
- POSIX 기본 정규 표현식(BRE) 엔진
- POSIX 확장 정규 표현식(ERE) 엔진

대부분의 리눅스 유틸리티는 최소한 BRE 엔진 제원을 준수한다.
(sed 편집기 등 BRE의 일부만 준수하는 유틸리티도 있다; sed는 빠른 속도의 처리를 위해 일부 BRE만 따름)
(gawk 편집기는 ERE 엔진을 사용하여 정규표현식 패턴을 처리한다.)

BRE 패턴

일반 텍스트
정규표현식 패턴은 일반 텍스트에 대하여 대소문자를 구분한다.
빈 칸 또한 정규표현식에서 하나의 문자처럼 간주한다.
특수 문자
. * [ ] ^ $ { } \ + ? #
위의 특수하게 지정된 문자들은 일반 텍스트로 인식하지 않는다.
(일반 텍스트로 사용하기 위해서 이스케이프 시킴)
앵커 문자
데이터 스트림에서 줄 처음 또는 줄의 끝으로 패턴을 고정시키기 위한 두 가지 앵커 문자
^(캐럿 문자): 텍스트 줄 시작 부분에서 시작하는 패턴을 정의
    ; 패턴이 줄의 시작이 아닌 다른 장소에 있다면, 정규표현식 패턴은 실패한다.(\n을 기준으로 처음)
    ; 캐럿 문자는 줄의 시작이 아닌 곳에 두면 특수문자가 아닌 일반 텍스트로 받아들인다.
$(달러 기호): 줄의 마지막 부분에서 끝나는 패턴을 정의
echo "The book store" | sed -n '/^The/p'
echo "The Book store" | sed -n '/store$/p'
앵커 두개를 결합하면, 문장에 대한 패턴을 매칭시킬 수 있으며, 앵커 두개만 사용할 경우 빈칸을 매칭 시킬 수 있다.
sed '/^$/d' data.txt
점 문자
줄 바꿈 문자를 제외한 모든 문자 한 개와 일치시키기 위해 사용한다.
점의 위치에 아무 문자도 없는 경우 매칭 실패
(화이트 스페이스 또한 하나의 문자로 취급되기 때문에 매칭됨)
문자 클래스
임의의 문자와 대조하기 할 때, 문자를 제한하기 위한 방법
echo "Yes" | sed -n '/[Yy]es/p'
echo "YES" | sed -n '/[Yy][Ee][Ss]/p'
부정형 문자 클래스
[^alphabets]
클래스에 포함된 문자를 찾는 대신 클래스에 없는 문자와 패턴 매칭
범위 사용하기
sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data.txt
echo "I'm getting too fat" | sed -n '/[a-ch-m]at/p'
[[:BRE 특수 문자 클래스:]]
[[:alpha:]]: [a-zA-Z]
[[:alnum:]]: [0-9a-zA-Z]
[[:blank:]]: 빈칸과 탭 문자와 매칭
[[:digit:]]: [0-9]
[[:lower:]]: [a-z]
[[:print:]]: 인쇄할 수 있는 모든 문자와 매칭
[[:punct:]]: 문장 부호 문자와 일치
[[:space:]]: 모든 화이트 스페이스 문자와 일치(스페이스, 탭, NL, FF, VT, CR 문자)
[[:upper:]]: [A-Z]
별표
*
글자 다음에 별표를 놓을 시, 대조하는 텍스트에서 그 문자가 0번 또는 그보다 많이 나와야 함
echo "I'm getting a color TV" | sed -n '/colou*r/p'
echo "this is a regular pattern expression" | sed -n '/regular.*expression/p'
 .과 함께 사용해서 어떤 문자가 0번 또는 더 많은 경우를 표현할 수 있다.
echo -e 'bt\nbat\nbet\nbtt' | sed -n '/b[ae]*t/p'

ERE 패턴

물음표
?
물음표는 문자가 없거나 한번 나타나는 것을 의미한다.
echo -e 'bt\nbet\nbeet\nbeeet' | gawk '/be?t/{print $0}'
echo -e 'bt\nbet\nbeet\nbeeet' | gawk '/b[ae]?t/{print $0}'
더하기
+
더하기는 앞의 문자가 한 번 이상 있다는 뜻으로 없는 경우 매칭 실패한다
echo -e 'bt\nbet\nbeet\nbeeet' | gawk '/b[ae]+t/{print $0}'
중괄호
{ }
인터벌; 제한적으로 정규표현식을 되풀이 할 때 사용
m: 정규표현식이 정확히 m번 나타남
m, n: 정규표현식이 적어도 m번 나타나지만, n번보다 많이 나타나지는 않음

gawk는 --re-interval 옵션이 있을 때만 인터벌 기능 사용 가능
echo -e 'bt\nbet\nbeet\nbeeet' | gawk --re-interval '/be{1}t/{print $0}'
echo -e 'bt\nbet\nbeet\nbeeet' | gawk --re-interval '/be{1,2}t/{print $0}'
파이프 기능
|
데이터를 검사할 때, 정규표현식 엔진이 논리 OR 식에 사용할 두 개 또는 그 이상의 패턴을 지정
expr1|expr2|...
echo 'This cat is asleep' | gawk '/cat|dog/{print $0}'
표현식 그룹화
echo -e 'Sat\nSaturday' | gawk '/Sat(urday)?/{print $0}'
echo -e 'cat\ncab\nbat\nbab\ntab\ntac' | gawk '/(c|b)a(b|t)/{print $0}'